//Ext.Button = function(){
////	debugger;
//	this.initialConfig ={};
//	this.getItemId = this.onAdded = this.render = this.setDisabled = function(){}
//	
//}
//Ext.reg('button', Ext.Button);

$$.domControl = function(args, domObj){
	var self	= arguments.callee;
	var fn		= args.callee;
	var cfg		= args[0];
	
	cfg = $$.apply({
		 text	: 'Submit'
		,cls	: fn.cls
		,event	: self.defaultEvent
		,fn		: self.defaultHandler
	}, cfg);
	
	domObj.className = cfg.cls;
	
	// 此阶段的 domObj 任务已完成（此函数中），踢掉它吧，鉴于是 HTMLElement 的东西，恐防 Mem.Leak，总是怕怕的。
	domObj = null;
	delete domObj;
	
	return cfg;
}
$$.domControl.defaultText		= 'default Text';
$$.domControl.defaultEvent		= 'click';
$$.domControl.defaultHandler	= function(){
	alert('You just acted!');
};

/**
 * 							
 * <div style="width:60%;" id="menu">
		<a href="###" class="edk_button">
			<button id="editStaticPage">固定页面</button>
		</a>
	</div>
 */
$$.Button = function(cfg){
	var aLink	= document.createElement('a');
	var self	= arguments.callee;
	
	cfg = $$.domControl(arguments, aLink);
	
	aLink.href	= cfg.href || self.emptyHref;
	
	var btn = document.createElement('button');
	btn.innerHTML = cfg.text;	// btn.appendChild(document.createTextNode(cfg.text));
	$$.on(btn, cfg.event, cfg.fn);
	
	aLink.appendChild(btn);
	
	btn = null;
	
	return aLink;
}
$$.Button.cls = 'edk_button';// 该样式中会 Block 化 A 元素
$$.Button.emptyHref = 'javascript:void(0);';

$$.Button.closeText = '关闭';

$$.Form = function(formEl){
	formEl.method = 'POST';
	
}

$$.form = (function(){
	var 
	 select = /select-(one|multiple)/i
	,btns	= /file|undefined|reset|button/i
	,radio  = /radio|checkbox/i
	,submit = /submit/i;
	

	
	/**
	 * 设置焦点在用户输入框。
	 */
	function setFocus_onInput(cmp){
		var btn = this.el.child('input:first');
			btn.focus();
	}

return {
	
	initHolder : function(cfg, containerType){

		var component = new Ext.Window(cfg);
		component.on('afterrender', setFocus_onInput, component, {deplay : 1000});
	    return component;
	}
	
	,getRawHTMLbyTextarea: function(id){
		var 
		rawHtml = Ext.get(id);
		rawHtml = rawHtml.dom.innerHTML;
	    rawHtml = rawHtml.replace(/&amp;/g, "&").replace(/&gt;/g, ">").replace(/&lt;/g, "<").replace(/&quot;/g, '"');
		return rawHtml;
	}
	
	/**
	 * 该方法源自Ext.lib.Ajax.serializeForm(form)，原来返回字符，现改为返回JSON。
	 * @param {el} form
	 * @return {Objct}
	 */
	,serializeForm : function (form) {
		var 
		 fElements = form.elements || (document.forms[form] || Ext.getDom(form)).elements
		,hasSubmit = false
		,element
		,options
		,name
		,val
		,data = {}
		,type;

		Ext.each(fElements, function(element) {
			name = element.name;
			type = element.type;

			if (!element.disabled && name) {
				if (select.test(type)) {
					Ext.each(element.options, function(opt) {
						if (opt.selected) {
							data[encodeURIComponent(name)] = encodeURIComponent((opt.hasAttribute
									? opt.hasAttribute('value')
									: opt.getAttribute('value') !== null)
									? opt.value
									: opt.text);
						}
					});
				}else if(!btns.test(type)) {
					if (!(radio.test(type) && !element.checked) && !(type == 'submit' && hasSubmit)) {
						data[encodeURIComponent(name)] = encodeURIComponent(element.value);
						hasSubmit = submit.test(type);
					}
				}
			}
		});
		return data;
	}
};
})();

$$.Validator = {
	Require : /.+/,
	Email : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
	Phone : /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/,
	Mobile : /^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$/,
	Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,
	IdCard : "this.IsIdCard(value)",
	Currency : /^\d+(\.\d+)?$/,
	Number : /^\d+$/,
	Zip : /^[1-9]\d{5}$/,
	QQ : /^[1-9]\d{4,8}$/,
	Integer : /^[-\+]?\d+$/,
	Double : /^[-\+]?\d+(\.\d+)?$/,
	English : /^[A-Za-z]+$/,
	Chinese : /^[\u0391-\uFFE5]+$/,
//  // Check Username -------------------------------------------
//  this.checkUsername = function(str){
//    if(typeof(str)!="string"){ return false; }
//    if(this.lengthW(str)<3||str.length>24){ return false; }
//    if(str.search(/[^\w\u3400-\u4DBF\u4E00-\u9FAF]/)!=-1){
//      return false;
//    }
//    return true;
//  }
	Username : /^[a-z]\w{3,}$/i,
//  // Check Password -------------------------------------------
//  this.checkPassword = function(str){
//    if(str==undefined){ return false; }
//    if(str.length<6||str.length>16){ return false; }
//    if(str.search(/[^\x20-\x7e]/g)!=-1){
//      return false;
//    }
//    return true;
//  }

	UnSafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/,
	IsSafe : function(str) {
		return !this.UnSafe.test(str);
	},
	SafeString : "this.IsSafe(value)",
	Filter : "this.DoFilter(value, getAttribute('accept'))",
	Limit : "this.limit(value.length,getAttribute('min'),  getAttribute('max'))",
	LimitB : "this.limit(this.LenB(value), getAttribute('min'), getAttribute('max'))",
	Date : "this.IsDate(value, getAttribute('min'), getAttribute('format'))",
	Repeat : "value == document.getElementsByName(getAttribute('to'))[0].value",
	Range : "getAttribute('min') < (value|0) && (value|0) < getAttribute('max')",
	Compare : "this.compare(value,getAttribute('operator'),getAttribute('to'))",
	Custom : "this.Exec(value, getAttribute('regexp'))",
	Group : "this.MustChecked(getAttribute('name'), getAttribute('min'), getAttribute('max'))",
	ErrorItem : [document.forms[0]],
	ErrorMessage : ["以下原因导致提交失败：\t\t\t\t"],
	Validate : function(theForm, mode) {
		var obj = theForm || event.srcElement;
		var count = obj.elements.length;
		this.ErrorMessage.length = 1;
		this.ErrorItem.length = 1;
		this.ErrorItem[0] = obj;
		for (var i = 0; i < count; i++) {
			with (obj.elements[i]) {
				var _dataType = getAttribute("dataType");
				if (typeof(_dataType) == "object"
						|| typeof(this[_dataType]) == "undefined")
					continue;
				this.ClearState(obj.elements[i]);
				if (getAttribute("require") == "false" && value == "")
					continue;
				switch (_dataType) {
					case "IdCard" :
					case "Date" :
					case "Repeat" :
					case "Range" :
					case "Compare" :
					case "Custom" :
					case "Group" :
					case "Limit" :
					case "LimitB" :
					case "SafeString" :
					case "Filter" :
						if (!eval(this[_dataType])) {
							this.AddError(i, getAttribute("msg"));
						}
						break;
					default :
						if (!this[_dataType].test(value)) {
							this.AddError(i, getAttribute("msg"));
						}
						break;
				}
			}
		}
		if (this.ErrorMessage.length > 1) {
			mode = mode || 1;
			var errCount = this.ErrorItem.length;
			switch (mode) {
				case 2 :
					for (var i = 1; i < errCount; i++)
						this.ErrorItem[i].style.color = "red";
				case 1 :
					alert(this.ErrorMessage.join("\n"));
					this.ErrorItem[1].focus();
					break;
				case 3 :
					for (var i = 1; i < errCount; i++) {
						try {
							var span = document.createElement("SPAN");
							span.id = "__ErrorMessagePanel";
							span.style.color = "red";
							this.ErrorItem[i].parentNode.appendChild(span);
							span.innerHTML = this.ErrorMessage[i].replace(
									/\d+:/, "*");
						} catch (e) {
							alert(e.description);
						}
					}
					this.ErrorItem[1].focus();
					break;
				default :
					alert(this.ErrorMessage.join("\n"));
					break;
			}
			return false;
		}
		return true;
	},
	limit : function(len, min, max) {
		min = min || 0;
		max = max || Number.MAX_VALUE;
		return min <= len && len <= max;
	},
	LenB : function(str) {
		return str.replace(/[^\x00-\xff]/g, "**").length;
	},
	ClearState : function(elem) {
		with (elem) {
			if (style.color == "red")
				style.color = "";
			var lastNode = parentNode.childNodes[parentNode.childNodes.length
					- 1];
			if (lastNode.id == "__ErrorMessagePanel")
				parentNode.removeChild(lastNode);
		}
	},
	AddError : function(index, str) {
		this.ErrorItem[this.ErrorItem.length] = this.ErrorItem[0].elements[index];
		this.ErrorMessage[this.ErrorMessage.length] = this.ErrorMessage.length
				+ ":" + str;
	},
	Exec : function(op, reg) {
		return new RegExp(reg, "g").test(op);
	},
	compare : function(op1, operator, op2) {
		switch (operator) {
			case "NotEqual" :
				return (op1 != op2);
			case "GreaterThan" :
				return (op1 > op2);
			case "GreaterThanEqual" :
				return (op1 >= op2);
			case "LessThan" :
				return (op1 < op2);
			case "LessThanEqual" :
				return (op1 <= op2);
			default :
				return (op1 == op2);
		}
	},
	MustChecked : function(name, min, max) {
		var groups = document.getElementsByName(name);
		var hasChecked = 0;
		min = min || 1;
		max = max || groups.length;
		for (var i = groups.length - 1; i >= 0; i--)
			if (groups[i].checked)
				hasChecked++;
		return min <= hasChecked && hasChecked <= max;
	},
	DoFilter : function(input, filter) {
		return new RegExp("^.+\.(?=EXT)(EXT)$".replace(/EXT/g, filter
								.split(/\s*,\s*/).join("|")), "gi").test(input);
	},

	IsDate : function(op, formatString) {
		formatString = formatString || "ymd";
		var m, year, month, day;
		switch (formatString) {
			case "ymd" :
				m = op.match(new RegExp("^((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})$"));
				if (m == null)
					return false;
				day = m[6];
				month = m[5] * 1;
				year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3],
						10));
				break;
			case "dmy" :
				m = op.match(new RegExp("^(\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))$"));
				if (m == null)
					return false;
				day = m[1];
				month = m[3] * 1;
				year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6],10));
				break;
			default :
				break;
		}
		if (!parseInt(month))
			return false;
		month = month == 0 ? 12 : month;
		var date = new Date(year, month - 1, day);
		return (typeof(date) == "object" && year == date.getFullYear()
				&& month == (date.getMonth() + 1) && day == date.getDate());
		function GetFullYear(y) {
			return ((y < 30 ? "20" : "19") + y) | 0;
		}
	}
}